package com.atguigu.tingshu.account.service.impl;

import com.atguigu.tingshu.account.mapper.UserAccountMapper;
import com.atguigu.tingshu.account.service.UserAccountService;
import com.atguigu.tingshu.model.account.UserAccount;
import com.atguigu.tingshu.vo.account.AccountDeductVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class UserAccountServiceImpl extends ServiceImpl<UserAccountMapper, UserAccount> implements UserAccountService {

    @Autowired
    private UserAccountMapper userAccountMapper;


    @Override
    public Long checkAndDeduct(AccountDeductVo accountDeductVo) {

        return userAccountMapper.checkAndDeduct(accountDeductVo.getAmount(),accountDeductVo.getUserId());
    }

    /**
     * 初始化用户账户
     * 该方法用于为指定的用户初始化其账户信息，确保每个用户在系统中都有一个默认的账户
     * 它通过创建一个新的UserAccount实例并将其保存到数据库中来实现这一点
     *
     * @param userId 用户ID，用于关联用户账户和特定用户
     */
    @Override
    public void initUserAccount(Long userId) {
        // 创建一个新的用户账户实例
        UserAccount userAccount = new UserAccount();

        // 设置用户账户的ID为传入的userId
        userAccount.setUserId(userId);

        // 设置用户账户的总金额为1000元
        userAccount.setTotalAmount(new BigDecimal("1000"));

        // 设置用户账户的可用金额为1000元
        userAccount.setAvailableAmount(new java.math.BigDecimal("1000"));

        // 将用户账户信息插入数据库
        userAccountMapper.insert(userAccount);
    }

    /**
     * 获取用户的可用金额
     *
     * @param userId 用户ID，用于查询特定用户的可用金额
     * @return 返回用户在账户中的可用金额，使用BigDecimal类型以精确处理金融数据
     */
    @Override
    public BigDecimal getAvailableAmount(Long userId) {
        // 通过用户ID查询用户账户的可用金额
        BigDecimal availableAmount = userAccountMapper.selectOne(new LambdaQueryWrapper<UserAccount>().eq(UserAccount::getUserId, userId)).getAvailableAmount();
        return availableAmount;
    }
}
